---
id: unit6
title: 第六章 数据库安全与保护 
---


## 数据库完整性
完整性约束条件的作用对象包括元组、列和表。

列级约束主要包括：  
（1）对数据类型的约束，包括数据类型、长度、精度等。  
（2）对数据格式的约束。  
（3）对取值范围或取值集合的约束。  
（4）对空值的约束。  

关系模型中包括实体完整性、参照完整性和用户定义的完整性三类完整性约束。

在MySQL中，实体完整性通过主键约束和候选键约束来实现。

命名完整性约束的方法是在各种完整性约束的定义说明之前加上关键字
“CONSTRAINT”和该约束的名字。

在MySQL中，指定一个外键时需要遵守的规则包括：
（1）被参照表必须已经用一条CREATE TABLE语句创建了，或者必须是当前正在
创建的表。如若是后一种情形，则被参照表与参照表是同一个表，这样的表称为自参照
表，这种结构称为自参照完整性。  
（2）必须为被参照表定义主键。  
（3）必须在被参照表的表名后面指定列名或列名的组合。这个列或列组合必须是这
个被参照表的主键或候选键。  
（4）尽管主键是不能够包含空值的，但允许在外键中出现一个空值。这意味着，只要
外键的每个非空值出现在指定的主键中，这个外键的内容就是正确的。  
23
（5）外键中的列的数目必须和被参照表的主键中的列的数目相同。  
（6）外键中的列的数据类型必须和被参照表的主键中的对应列的数据类型相同。  

## 触发器
触发器是用户定义在关系表上的一类由事件驱动的数据库对象，也是一种保证数据完整性的方法。

简述触发器的主要作用。
触发器的主要作用是实现主键和外键不能保证的复杂的参照完整性和数据的一致性，从而有效地保护表中的数据。

在MySQL中，可以使用CREATE TRIGGER 语句创建触发器。在触发器的创建中，每个表每个事件每次只允许一个触发器。所以，每个表最多支持6个触发器，单一触发器不能与多个事件或多个表关联。

MySQL支持的触发器有INSERT触发器、DELETE触发器和UPDATE触发器三种。

## 安全性与访问控制
数据库的安全性是指保护数据库以防止不合法的使用而造成数据泄露、更改或破坏。

在MySQL数据库中，数据库系统对数据的安全管理是使用身份验证、数据库用户权限确认等访问控制措施，来保护数据库中的信息资源，以防止这些数据遭受破坏。

MySQL的用户账号及相关信息都存储在一个名为mysql的MySQL数据库中，这个数据库里有一个名为user的数据表，包含了所有用户账号，并且它用一个名为user的列存储用户的登录名。

可以使用GRANT语句来实现权限的授予。
24·
如果将WITH子权限的转移可以通过在GRANT语句中使用WITH子句来实现。乌需健为发时学WITE GRANT OPTON＂，则表示TO子句中所输定的所有用有把自已所理有的权限授予给其他用户的权利，而无论那些其他用户是否拥有该权鼠。
当需要量销一个用户的权限而又不希望将该用户从系统中刷除时，可以使用REVOKEM包来实现。要使用 REVOKE 请句，必须拥有my4 数据库的金局 CREATEUSER 权限或UPDATE权限。

## 事务与并发控制
为了保证数据的一致性和正确性，数据库系统必须保证事务具有四个特征，即原子性、一致性、隔离性和持续性。这四个特性也简称为事务的ACID特征。

当多个事务交错执行时，可能出现不一致问题，这也称为并发操作问题，包括丢失更新、不可重复读和读“脏”数据三种典型的并发操作问题。

简述封锁的基本思想。
封锁的基本思想是：需要时，事务通过向系统请求对它所希望的数据对象加锁，以确保它不被非预期改变。

通常以粒度来描述封锁的数据单元的大小。DBMS可以决定不同粒度的锁。由最底层的数据元素到最高层的整个数据库，粒度越细，并发性就越大，但软件复杂性和系统开销也就越大。

两个以上事务循环等待被同组中另一事务锁住的数据单元的情形，称为“死锁”。

死锁的预防主要有以下方法：
（1）一次性锁请求。每一事务在处理时一次提出所有的锁请求，仅当这些请求全部南
足时事务处理才进行，否则让其等待，这样则不会出现死锁的情况。  
（2）锁请求排序。将每个数据单元标以线性顺序，然后要求每一事务都按此顺序提出
锁请求。  
（3）序列化处理。通过应用设计为每一数据单元建立一个“主人”程序，对给定数据单
元的所有请求都发送给“主人”，而“主人”以单道的形式运行。  
（4）资源剥夺。每当事务因锁请求不能满足而受阻时，强行令两个冲突的事务中的一
个ROLLBACK，释放所有的锁，以后再重新运行。使用这个方法必须注意防止活锁的
发生。  

事务划分成如下两个阶段：  
（1）发展或加锁阶段。  
（2）收缩或释放锁阶段。  

## 备份与恢复
造成数据库运行事务异常中断的因素包括计算机硬件故障、计算机软件故障、病毒、人为误操作、自然灾害和盗窃。

数据库备份是指通过导出数据或者复制表文件的方式来制作数据库的复本；数据库恢复则是当数据库出现故障或遭到破坏时，将备份的数据库加载到系统，从而使数据库从错误状态恢复到备份时的正确状态。
